package com.bici.service;

import com.bici.domain.User;
import com.bici.mapper.UserMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * 使用@CacheConfig是一个类级别的注解，允许共享缓存的名称、KeyGenerator、CacheManager 和CacheResolver。
 */
@Service
@CacheConfig(cacheNames = "user")
public class UserService {
    @Autowired
    private UserMapper userMapperr;

    /**
     * 使用@CachePut：在新增对象时就放入缓存中，一般不建议这么做，因为会造成缓存过多，也没有必要每条新增数据都放入缓存
     *
     * @param user
     */
    public void save(User user) {
        int i = 1;
        userMapperr.save( user);
    }

    /**
     * 通过ID查询数据
     * unless：true表示不保存到缓存，与condition相反
     *
     * @param id
     * @return
     */
    @Cacheable(key = "#id", unless = "#result == null")
    public User getById(Integer id) {
        int j = 0;
        return userMapperr.getById(id);
    }

    /**
     * 使用@CacheEvict消除缓存，在每次对数据进行删除时，就清除缓存。
     *
     * @param id
     */
    @CacheEvict(key = "#id")
    public void delete(@Param("id") Integer id) {
        // 删除
        userMapperr.delete(id);
    }

    /**
     * 修改时建议清除缓存，而不是重新放入缓存，这样可以避免多个线程修改相同数据时，
     * 最后有效的修改不是放入缓存的数据，造成数据不是最新数据。
     *
     * @param user
     */
    @CacheEvict(key = "#user.id")
    public void update(User user) {
        /*
            更新
            用户
        */
        userMapperr.update(user);
    }

    public void info() {
        int i = 1;
    }
}
